﻿using EntitiesAndMappings.Entities;
using System;
using NHibernate.Criterion;
using System.Collections.Generic;
using NHibernate.SqlCommand;
using NHibernate;
using NHibernate.Transform;

namespace ProyectoActivos.Daos
{
    public class SalidaDAO : BaseDAO<Salida>
    {

        public IList<Salida> Buscar(Salida salida)
        {
            IList<Salida> lista;
            using (var session = CreateSessionFactory().OpenSession())
            {
                
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria(typeof (Salida), "Salida")
                        .CreateAlias("TipoMovimiento", "TipoMovimiento", JoinType.InnerJoin)
                        .CreateAlias("Almacen", "Almacen", JoinType.LeftOuterJoin)
                        //.CreateAlias(
                        //.SetFetchMode("Salida.Items", FetchMode.Join)
                        //.SetFetchMode("Salida.Items.ItemsEntregaEquipo", FetchMode.Join)
                        //.SetResultTransformer(new DistinctRootEntityResultTransformer());
                        ;

                     
                    if (!salida.Fecha.Equals(DateTime.MinValue))
                    {
                        int anho = salida.Fecha.Year, mes = salida.Fecha.Month;
                        criteria.Add(Expression.Between("Salida.Fecha",
                                                        new DateTime(anho, mes, 1),
                                                        new DateTime(anho, mes, DateTime.DaysInMonth(anho, mes))));
                    }

                    if (!String.IsNullOrEmpty(salida.NumeroGuia))
                    {
                        criteria.Add(Expression.InsensitiveLike("Salida.NumeroGuia", salida.NumeroGuia, MatchMode.Start));
                    }

                    if (salida.TipoMovimiento != null && salida.TipoMovimiento.Id > 0)
                    {
                        criteria.Add(Expression.Eq("Salida.TipoMovimiento.Id", salida.TipoMovimiento.Id));
                    }

                    if (salida.Almacen != null && salida.Almacen.Id > 0)
                    {
                        criteria.Add(Expression.Eq("Salida.Almacen.Id", salida.Almacen.Id));
                    }


                    lista = criteria.List<Salida>();
                    transaction.Commit();
                }

            }
            return lista;
        }

    }
}
